#include "myUart.h"

//uint8_t  rx_buffer1[USART_REC_LEN] __attribute__ ((at(0X20001000)));//接收缓冲,最大USART_REC_LEN个字节,起始地址为0X20001000.
uint8_t  rx_buffer1[100];
uint32_t buffsize1=100;
uint32_t rx_len1=0;
volatile uint8_t uart1recv_end_flag=0;

//uint8_t rx_buffer5[USART_REC_LEN] __attribute__ ((at(0X20008900)));//接收缓冲,最大USART_REC_LEN个字节,起始地址为0X20001000.  
uint8_t rx_buffer5[100];
uint32_t buffsize5=100;
uint32_t rx_len5=0;
volatile uint8_t uart5recv_end_flag=0;

uint8_t flag_update_program=0;
uint32_t packLen=0;	//8266接收到的一包数据长度
uint32_t fileLen;//准备接收的数据长度
uint32_t recieive_count;
uint32_t APP_CONFIG_SET_VALUE[]={0xffff5555};

void judge_appOrIap(void)
{
		if (STMFLASH_ReadWord(JUMP_FLG_ADDR) == 0xffff5555)
  {
//		debug("hlly执行APP\r");	//无效——debug还未生效
   iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
	}
}
void iap_welcome(void)
{
	debug("hlly进入IAP\r;");	
	debug("更新标志为%x\n;",STMFLASH_ReadWord(JUMP_FLG_ADDR));
	debug("等待下载APP……\r;");
	debug("栈顶地址为为%x\n;",(*(vu32*)FLASH_APP1_ADDR));
//	STMFLASH_Write(JUMP_FLG_ADDR,APP_CONFIG_SET_VALUE,1);//手动下载APP并进入APP	
}
void uartData_process(u8 *buf,u16 id,u8 datalen)
{
	switch(id)
	{	
		case 0x0000:	
//			iap_in(buf);
			if(buf[0]==0)
			{
				debug("进入APP;");
				STMFLASH_Write(JUMP_FLG_ADDR,APP_CONFIG_SET_VALUE,1);
				debug("系统复位;");
				NVIC_SystemReset();
			}
			if(buf[0]==1)
			{
				debug("已进入IAP;");
			}
			else if(buf[0]==2)
			{
				flag_update_program=1;
				debug("准备接收固件...");	
			}
			else if(buf[0]==3)
			{
				fileLen=buf[1]<<24|buf[2]<<16|buf[3]<<8|buf[4];
				debug("准备接收固件大小为:%dBytes",fileLen);
			}
			break;
	}
}
uint8_t cmdData[100];
void uartData_verify(u8* buffer,u16 len)
{
	u8 sum;
	u16 cmdId;	

	sum=SumCheck(buffer,len-2);
	if(sum==buffer[len-2])//验证校验和
	{
//				debug("校验和为%bx;",sum);
		cmdId=buffer[4]<<8|buffer[5];	
		memset(cmdData,0,100);
		memcpy(cmdData, buffer+6, len-8);//有效数据拷贝出来并处理
//		uart_send(&huart1,0x4000,&buffer[4],len-6);//收到数据回复
		uartData_process(cmdData,cmdId,len-10);
	}
	
}
void uartData_depart(u8* buffer,u16 datalenth)
{
	u16 len;
	if(buffer[0]==0x50&buffer[1]==0x43)//验证上位机帧头
	{
//	debug("帧头;");
		len=buffer[2]<<8|buffer[3];
		if(len<datalenth)
		{
			uartData_depart(buffer,len);
			uartData_depart(&buffer[len-1],datalenth-len);

		}
		else if(len==datalenth)//验证数据长度
		{
			//debug("长度;");
			if(buffer[len-1]==0xda)//验证帧尾
			{
				//debug("帧尾;");
				uartData_verify(buffer,len);	
			}				
		}
	}
}

void uart_receive(void)
{
	if(uart1recv_end_flag ==1)
		{
			if(flag_update_program)
			{
				flag_update_program=0;
				packLen=rx_len1;
				debug("hlly\n;");
				debug("代码长度:%dBytes\r;",packLen);
				debug("用户程序接收完成!\r\n;");
				if(packLen)
				{
					debug("开始更新固件...\r\n;");	
					if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
					{	 
						iap_write_appbin(FLASH_APP1_ADDR,rx_buffer1,packLen);//更新FLASH代码   
						debug("固件更新完成!\r\n;");	
						STMFLASH_Write(JUMP_FLG_ADDR,APP_CONFIG_SET_VALUE,1);
						debug("系统复位;");
						NVIC_SystemReset();
//						__disable_irq();    //很重要，跳转之前必须关总中断，否则APP中重新设置中断向量表会出错
//						debug("> Start Running APP1 ......\r\n\r\n");
//						iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
					}else debug("非FLASH应用程序!\r\n;");
				}else debug("没有可以更新的固件!\r\n;");
			}	
			else
			{
				uartData_depart(rx_buffer1,rx_len1);
			}
//			if(rx_buffer1[0]==0x47&rx_buffer1[1]==0x51)
//			{
////				//跳转APP程序
////				if(rx_buffer1[2]==0x4A)
////				{
////					debug("kais程序!\r\n");	
//////					__disable_irq();    //很重要，跳转之前必须关总中断，否则APP中重新设置中断向量表会出错

//////					USART_DeInit(USART1);
//////					__set_FAULTMASK(1);
//////					debug("> Start Running APP1 ......\r\n");
////////					SysTick->CTRL =0;
//////					iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
////				}
//				//P准备更新程序
//				if(rx_buffer1[2]==0x55)
//				{
//					flag_update_program=1;
//					debug("准备接收程序...\r\n;");	
//				}	
//			}
			for(uint32_t i=0;i<rx_len1;i++)
				{
					rx_buffer1[i]=0;//清接收缓存
				}
			rx_len1=0;//清除计数
			uart1recv_end_flag=0;//清除接收结束标志位
		}
		HAL_UART_Receive_DMA(&huart1,(uint8_t *)rx_buffer1,buffsize1);//重新打开DMA接收
		if(uart5recv_end_flag ==1)
		{
			if(flag_update_program)
			{
				recieive_count+=rx_len5;
//				if(rx_len5!=31)debug("接收数据长度有误");
//				debug("接收第%d段代码",recieive_count);
				debug("%d",recieive_count/31/32);
//				if(recieive_count>30)
//				{
//					recieive_count=0;
//					flag_update_program=0;
//				}
				packLen=rx_len5;
//				debug("hlly\n");
//				debug("代码长度:%dBytes\r",packLen);
//				debug("用户程序接收完成!\r\n");
				if(packLen==0xffff)
				{
					debug("开始更新固件...\r\n");	
					if(((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)//判断是否为0X08XXXXXX.
					{	 
						iap_write_appbin(FLASH_APP1_ADDR,rx_buffer1,packLen);//更新FLASH代码   
						debug("固件更新完成!\r\n");	
						STMFLASH_Write(JUMP_FLG_ADDR,APP_CONFIG_SET_VALUE,1);
						debug("系统复位");
						NVIC_SystemReset();
//						__disable_irq();    //很重要，跳转之前必须关总中断，否则APP中重新设置中断向量表会出错
//						debug("> Start Running APP1 ......\r\n\r\n");
//						iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
					}else debug("非FLASH应用程序!\r\n");
				}
			}	
			if(rx_buffer5[0]==0x47&rx_buffer5[1]==0x51)
			{
//				//跳转APP程序
//				if(rx_buffer1[2]==0x4A)
//				{
//					debug("kais程序!\r\n");	
////					__disable_irq();    //很重要，跳转之前必须关总中断，否则APP中重新设置中断向量表会出错

////					USART_DeInit(USART1);
////					__set_FAULTMASK(1);
////					debug("> Start Running APP1 ......\r\n");
//////					SysTick->CTRL =0;
////					iap_load_app(FLASH_APP1_ADDR);//执行FLASH APP代码
//				}
				//P准备更新程序
				if(rx_buffer5[2]==0x55)
				{
					flag_update_program=1;
					debug("准备接收程序...\r\n");	
					debug("上次接收代码长度为:%dBytes\r",recieive_count);
					recieive_count=0;
					debug("接收代码长度为:%dBytes\r",recieive_count);
				}	
				else if(rx_buffer5[2]==0x77)
				{					
					STMFLASH_Write(JUMP_FLG_ADDR,APP_CONFIG_SET_VALUE,1);//手动下载APP并进入APP	
					debug("进入APP;");					
					NVIC_SystemReset();					
				}
			}
			for(uint32_t i=0;i<rx_len5;i++)
			{
				rx_buffer5[i]=0;//清接收缓存
			}
			rx_len5=0;//清除计数
			uart5recv_end_flag=0;//清除接收结束标志位
		}
		HAL_UART_Receive_DMA(&huart5,(uint8_t *)rx_buffer5,buffsize5);//重新打开DMA接收
    
}
